#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include "cJSON.h"
#include "ui_message_handler.h"
#include "ui_message.h"
#include "control.h"
#include <ui.h>
#include <unistd.h>
#include "lvgl.h"
#include <stdio.h>

lv_timer_t *weather_timer = NULL; // 声明全局定时器变量 



#define WEATHER_API_URL "http://api.seniverse.com/v3/weather/now.json?key=S88Cc5M7ulD0cdUoV&location=guangzhou&language=zh-Hans&unit=c"
#define SERVER_PORT 9963
#define MAX_BUFFER  1024

// 声明外部UI对象
extern lv_obj_t* ui_wendu1;

void http_response_handler(const char* response) {
    printf("INFO: [HTTP] 原始响应: %s", response); // 确认数据接收
    cJSON* root = cJSON_Parse(response);
    if (!root) {
        printf("ERROR: JSON解析失败，响应数据为空或格式错误\n");
        return;
    }
    cJSON* results = cJSON_GetObjectItem(root, "results");
    if (!results) {
        cJSON_Delete(root);
        return;
    }

    cJSON* item = cJSON_GetArrayItem(results, 0);
    printf("DEBUG: 解析results[0]字段: %s", item ? "成功" : "失败");
    if (!item) {
        cJSON_Delete(root);
        return;
    }

    cJSON* now = cJSON_GetObjectItem(item, "now");
    printf("DEBUG: 解析now字段: %s\n", now ? "成功" : "失败");
    if (!now) {
        cJSON_Delete(root);
        return;
    }

    // 解析温度（增强错误处理）
    cJSON *temp_obj = cJSON_GetObjectItem(now, "temperature");
    if (!temp_obj || !cJSON_IsString(temp_obj)) {
        printf("ERROR: JSON解析错误: 温度字段不存在或类型错误\n");
        cJSON_Delete(root);
        return;
    }
    const char* temp = temp_obj->valuestring;
    printf("解析到温度值: %s℃\n", temp);
    
    // 温度数据验证与转换
    char* endptr;
    double temp_val = strtod(temp, &endptr);
    if (endptr == temp || temp_val < -40 || temp_val > 85) {
        printf("WARN: 无效温度值: %s℃，使用默认值25℃\n", temp);
        temp_val = 25.0;
    }
    
    // 格式化温度字符串，保留一位小数
    char temp_str[16];
    snprintf(temp_str, sizeof(temp_str), "%.1f", temp_val); // 添加温度单位符号
    
    // 调试日志：显示解析后的温度值
    printf("INFO: 准备更新UI温度: %s\n", temp_str);
    printf("DEBUG: 温度值解析结果: 原始=%s, 转换后=%.1f, 格式化后=%s\n", temp, temp_val, temp_str);
    
    // 检查UI控件是否有效
    if (!ui_wendu1) {
        printf("ERROR: ui_wendu1控件未初始化\n");
        cJSON_Delete(root);
        return;
    }
    
    // 构造天气更新消息
    // 使用安全的温度更新函数发送消息
    safe_update_temperature(ui_wendu1, temp_str);
    printf("INFO: 温度更新消息已通过safe_update_temperature发送: %s\n", temp_str);
      
    cJSON_Delete(root);
}

// 定义响应数据结构体
typedef struct {
    char* data;
    size_t size;
} ResponseData;

// libcurl回调函数：接收HTTP响应数据
static size_t write_callback(void* contents, size_t size, size_t nmemb, void* userp) {
    size_t realsize = size * nmemb;
    ResponseData* mem = (ResponseData*)userp;

    char* ptr = realloc(mem->data, mem->size + realsize + 1);
    if (!ptr) {
        printf("ERROR: 内存分配失败，释放已分配内存\n");
        free(mem->data);
        mem->data = NULL;
        mem->size = 0;
        return 0;
    }

    mem->data = ptr;
    memcpy(&(mem->data[mem->size]), contents, realsize);
    mem->size += realsize;
    mem->data[mem->size] = '\0';

    return realsize;
}

// 初始化libcurl
void http_client_init(void) {
    static bool initialized = false;
    if (!initialized) {
        CURLcode res = curl_global_init(CURL_GLOBAL_DEFAULT);
        if (res != CURLE_OK) {
            printf("ERROR: libcurl初始化失败: %s\n", curl_easy_strerror(res));
            return;
        }
        initialized = true;
        printf("INFO: libcurl初始化成功\n");
    }
}

// 线程参数结构体定义
typedef struct {
    const char* url;
    void (*callback)(const char*);
} ThreadArgs;

// 线程函数：执行HTTP请求
static void* http_thread_func(void* arg) {
    ThreadArgs* args = (ThreadArgs*)arg;
    CURL* curl = curl_easy_init();
    if (!curl) {
        printf("ERROR: curl初始化失败\n");
        free(args);
        return NULL;
    }

    ResponseData response = {.data = NULL, .size = 0};
    curl_easy_setopt(curl, CURLOPT_URL, args->url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);

    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK) {
        printf("ERROR: HTTP请求失败: %s\n", curl_easy_strerror(res));
        free(response.data);
    } else {
        if (args->callback && response.data) {
            args->callback(response.data);
        }
        free(response.data);
    }

    curl_easy_cleanup(curl);
    free(args);
    return NULL;
}

// 异步HTTP请求函数（使用libcurl）
void http_get_async(const char* url, void (*callback)(const char*)) {
    // 确保libcurl已初始化
    http_client_init();

    // 创建线程处理HTTP请求
    pthread_t thread_id;
    ThreadArgs* args = malloc(sizeof(ThreadArgs));
    if (!args) {
        printf("ERROR: 线程参数内存分配失败\n");
        return;
    }
    args->url = url;
    args->callback = callback;

    // 创建并启动线程
    if (pthread_create(&thread_id, NULL, http_thread_func, args) != 0) {
        printf("ERROR: 创建HTTP请求线程失败\n");
        free(args);
    } else {
        pthread_detach(thread_id); // 分离线程，自动回收资源
    }
}

// 定时器回调函数：定期更新天气
void http_weather_update(lv_timer_t *timer) {
        printf("INFO: 天气定时器触发，正在请求天气数据...\n");
    http_get_async(WEATHER_API_URL, http_response_handler);
    printf("DEBUG: HTTP请求已发送，URL: %s\n", WEATHER_API_URL);
}

// 初始化天气更新定时器
void http_weather_init(void) {
    // 创建每60秒触发一次的定时器
    uint32_t timer_interval = 60000; // 60秒更新间隔
    weather_timer = lv_timer_create(http_weather_update, timer_interval, NULL);
    if(!weather_timer) {
        printf("ERROR: 创建天气更新定时器失败\n");
        return;
    }
    printf("INFO: 天气更新定时器已启动，ID: %p, 间隔: %d ms\n", weather_timer, (int)timer_interval);
    // 立即触发一次数据请求
    http_weather_update(NULL);
    printf("INFO: 天气更新服务已初始化，立即请求数据，后续每%d秒更新一次\n", (int)(timer_interval/1000));
    printf("INFO: 已启动天气更新服务，使用API: %s\n", WEATHER_API_URL);
}
static void weather_timer_cb(lv_timer_t* timer) {
    char* api_url = (char*)timer->user_data;
    http_get_async(api_url, http_response_handler);
}

// 天气服务初始化
void init_weather_service() {
    printf("WARN:请使用http_weather_init\n");
    http_weather_init();
}



